class Solution {
    vector<vector<int>> res;  // 存放结果集合
    vector<int> path;  // 存放结果
public:
  // 回溯：递归循环
    void backtrack(int n, int k, int begin){
        if(path.size() == k){
            res.push_back(path);
            return ;
        }
        //for(int i = begin; i <= n; ++i){
        /* 优化，如果起始位置之后的元素个数 不足所需的元素个数就结束  */
        for(int i = begin; i <= n-(k-path.size())+1; ++i){
            path.push_back(i);
            backtrack(n, k, i+1);
            path.pop_back();   // 回溯
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtrack(n, k, 1);   // [1,n]
        return res;
    }
};